package com.cskaoyan.javase.oop1._12anonymous;

/**
 * 匿名（anonymous）或者佚名，指的是没有名字或者名字缺失。
 * 在Java当中，匿名对象指的就是没有名字的对象。
 * 或者，说的更清楚一点，就是：在创建对象时，就没有引用指向的对象，就是匿名对象！
 * 匿名对象的语法很简单，只需要在方法等位置中写下列语法：
 * new 类名();
 * 以上语法就得到了一个匿名对象，从实质上看：
 * 该对象没有栈上的引用指向，没有所谓的"对象名"，是一个匿名对象。
 *
 * 匿名对象的使用:
 *      由于它没有,所以不能使用对象名点访问
 *      所以它只能在定义的时候,直接使用它,不然也没法用了
 *      直接在匿名对象后面点,使用
 * 但是一般来说,从实际角度出发,一般很少定义匿名对象,为了去访问对象的成员
 * 匿名对象更贴近实际的使用场景是配合方法使用:
 *      1.当方法需要返回一个对象时,普通的做法是创建对象,返回对象的引用
 *           但也可以直接返回匿名对象,作为方法的返回值
 *
 *      2.当方法需要传入一个对象时,普通的做法是传入对象的引用
 *          但实际上也可以传入匿名对象
 *
 * 匿名对象的优点:
 *      1.更加方便,更加简洁(比起创建对象,使用引用来说)
 *          这是最大的优点
 *      2.(凑一个优点)
 *          匿名对象更早成为垃圾,理论上来说,更早被垃圾回收,提升内存利用率
 *          (但是由于GC非即时性,这点其实并不一定)
 * 匿名对象的缺点:
 *      一次性,仅能用一次,不能多次使用
 *
 * 综上,在一些仅需要对象做一次操作,用一次时,就可以使用匿名对象,会更加简洁
 *      但是如果需要频繁多次使用一个对象
 *      再用匿名对象就得不偿失了
 *
 *  如果一个对象需要使用多次,那尽量还是用引用接收它吧
 *
 * @since 11:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 创建匿名对象,需要直接使用它
        System.out.println(new Student().age);
        new Student().eat();

        Student s = new Student();
        test(s);
        test(new Student());
    }

    public static void test(Student s){}

    public static Student getStudentInstance(){
        // Local variable 's' is redundant
        /*Student s = new Student();
        return s;*/
        return new Student();
    }
}

class Student {
    int age;

    public void eat() {
        System.out.println("今天吃炒饭!");
    }
}